{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Demo 06: Algorithms02"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This demo will demonstrate the options for plotting projections and images on TIGRE. The functions have been in previous demos, but in here an exaustive explanation and usage of them is given."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define Geometry"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tigre\n",
    "geo=tigre.geometry_default(high_quality=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load data and generate projections"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from tigre.utilities.Ax import Ax\n",
    "from tigre.demos.Test_data import data_loader\n",
    "# define angles\n",
    "angles=np.linspace(0,2*np.pi,dtype=np.float32)\n",
    "# load head phantom data\n",
    "head=data_loader.load_head_phantom(number_of_voxels=geo.nVoxel)\n",
    "# generate projections\n",
    "projections=Ax(head,geo,angles,'interpolated')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## SART family of algorithms"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SIRT algorithm in progress.\n",
      "Esitmated time until completetion (s): 14.897617\n",
      "OSSART algorithm in progress.\n",
      "Esitmated time until completetion (s): 27.362433\n",
      "SART algorithm in progress.\n",
      "Esitmated time until completetion (s): 254.08852\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# There are 3 algorithms in this damily included in TIGRE: SART,SIRT and\n",
    "# OS-SART.\n",
    "\n",
    "# The main difference between them is the update process. \n",
    "# SART: Updates the image projection by projection\n",
    "# SIRT: Updates the image using the whole set of projections at once\n",
    "# OS-SART: middle ground. Updates the image using a subset of the\n",
    "#          projections\n",
    "\n",
    "# Of these algorithms, SART is generally the one reaching a better image\n",
    "# (less L2 error) for the same amount of iterations, and SIRT is the\n",
    "# worst (still relatively similar). However, SART needs increased\n",
    "# computational time per iteration, as it needs to update the image very    often,\n",
    "# while SIRT only updates the emage ones for the whole sets of projections.\n",
    "# OS-SART lies in the middle, reaching similar convergence (L2 error per\n",
    "# iteration) than SART but with less computational time than SART.\n",
    "\n",
    "# Usage, with optional parameters.\n",
    "# In the three algorithms, there are 4 mandatory input arguments:\n",
    "# Projections, geometry, angles and number of iterations.\n",
    "\n",
    "# Optional arguments for all of them\n",
    "#==========================================================================\n",
    "# 'lmbda': hyperparameter. The update will be multiplied by this number\n",
    "# every iteration, to make the steps bigger or smaller. Default: 1\n",
    "\n",
    "lmbda=1;\n",
    "\n",
    "\n",
    "#'lmbdared': reduction multiplier for the hyperparameter.\n",
    "# lmbda=lmbda*lmbdared every iterations, so the steps can be smaller\n",
    "# the further the update. Default=0.99\n",
    "lmbdared=0.999;\n",
    "\n",
    "# 'Init' : Initialization method. Possible options are\n",
    "#          'none' (default). There will be no initialization method, just\n",
    "#                 the algorithm\n",
    "  \n",
    "#          'FDK'  Initialize the image with the result of FDK algorithm\n",
    "\n",
    "#          'multigrid' Initialize using the multigrid method. The image\n",
    "#                      will be solved in a small scale, and the size of it\n",
    "#                      will increase until the desired size is reached.\n",
    "#\n",
    "#          'image'     Initialzies with a user given image. Not recoomended\n",
    "#                      unless you really know what you are doing.\n",
    "\n",
    "init=None;\n",
    "\n",
    "#'InitImg' : related to init. The image to use for initializing the\n",
    "# algorithm.\n",
    "\n",
    "# 'verbose': boolean to make the algorithm display (or not) running state. \n",
    "#            default true.\n",
    "\n",
    "verbose=True;\n",
    "# 'QualMeas'     Asks the algorithm for a set of quality measurement\n",
    "#                parameters. Input should contain a cell array of desired\n",
    "#                quality measurement names. Example: {'CC','RMSE','MSSIM'}\n",
    "#                These will be computed in each iteration. \n",
    "QualMeas='RMSE';\n",
    "# OS-SART\n",
    "# ========================================================================\n",
    "# Additionally OS-SART includes a couple of other parameters, related to\n",
    "# the subsets.\n",
    "#\n",
    "#   'blocksize':   Sets the projection block size used simultaneously. If\n",
    "#                  BlockSize = 1 OS-SART becomes SART and if  BlockSize = length(angles)\n",
    "#                  then OS-SART becomes SIRT. Default is 20.\n",
    "\n",
    "# EXAMPLES:\n",
    "# ----------------------------------------------------------------------\n",
    "import tigre.algorithms as algs\n",
    "\n",
    "iterations=50\n",
    "sirt,sirt_l2err=algs.sirt(projections,geo,angles,iterations,**dict(computel2=True))\n",
    "ossart,ossarterr=algs.ossart(projections,geo,angles,iterations,**dict(blocksize=20,computel2=True))\n",
    "sart,sarterr=algs.sart(projections,geo,angles,iterations,**dict(computel2=True))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tigre.utilities.plotimg import plotimg\n",
    "plotimg(np.hstack((sart,ossart,sirt)),slice=32,dim='z')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEKCAYAAAD5MJl4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlYVdX6wPHvElEQHHAuIHGeFQWn1BxLLbUs59Jmuzet\nbDC1LKcsm0wbtFvqz+E6pmnllKaSWqnhrDiRI6iIODLJ9P7+4HAuCgoisIHzfp7nPGeftfde+10o\n52XvtfbaRkRQSimlUitkdQBKKaXyHk0OSiml0tDkoJRSKg1NDkoppdLQ5KCUUioNTQ5KKaXS0OSg\nlFIqDU0OSiml0tDkoJRSKo3CVgeQVWXLlhUfHx+rw1BKqXxlx44dF0SkXEbb5dvk4OPjQ2BgoNVh\nKKVUvmKMOZmZ7fSyklJKqTQ0OSillEpDk4NSSqk08m2fgyq44uPjCQkJITY21upQHJKLiwteXl44\nOztbHYqykCYHleeEhIRQvHhxfHx8MMZYHY5DEREiIiIICQmhcuXKVoejLKSXlVSeExsbS5kyZTQx\nWMAYQ5kyZfSsTWlyUHmTJgbr6M9egSYHpZRS6XC45LBixQqaN2/OxYsXrQ5F5TMvvPACQUFB6a6b\nPHky0dHR6a5r27YtgYGBREdH88gjj1CrVi3q1q3LiBEjcjJcpe6KwyWH2NhYtm3bxunTp60OReUz\n06dPp06dOmnKExMTb5scUnvrrbc4dOgQu3bt4o8//mD16tVZiiUhIeG2n5W6Ww6XHLy8vAAIDQ21\nOBKVV0VFRfHII4/QsGFD6tWrx6JFi4D/nQEAuLu78+abb9KwYUMmTJjAmTNnaNeuHe3atbtlvcWK\nFbOvL1KkCI0bNyYkJCTd4z/33HM0bdqURo0a8dNPPwEwa9YsunfvTvv27enQoQMBAQG0bt2a7t27\np5u0lLobDjeU1dPTEyDdX0qVN7Vt2zZNWdeuXXnrrbeytD4gIOC2x1uzZg333nsvK1euBODKlStp\ntomKiqJZs2Z8/vnnAMycOZONGzdStmzZDFqT7PLly/zyyy+89tpradZNmDCB9u3bM3PmTC5fvkzT\npk3p2LEjADt37mTv3r2ULl2agIAAdu7cyf79+3XYqcp2DnfmULFiRQoVKqTJQd1S/fr1WbduHcOH\nD2fz5s2ULFkyzTZOTk488cQTWao/ISGBfv368eqrr1KlSpU069euXcvEiRPx9fWlbdu2xMbGcurU\nKQAefPBBSpcubd+2adOmmhhUjnC4MwdnZ2datGiBu7u71aGoTMroL/27XX+zGjVqsHPnTlatWsWo\nUaPo0KED77///g3buLi44OTkdEf1phg0aBDVq1dn6NCh6a4XEZYuXUrNmjVvKN+2bRtubm43lN38\nWans4nBnDgBbtmzh7bfftjoMlUedOXOGYsWK8dRTTzFs2DB27tyZ4T7Fixfn2rVrGW43atQorly5\nwuTJk2+5TadOnfjqq68QEQB27dqV+eCVyiYOmRyUup19+/bRtGlTfH19GTt2LKNGjcpwn0GDBtG5\nc+fbdkiHhIQwYcIEgoKCaNy4Mb6+vkyfPj3Ndu+99x7x8fE0aNCAunXr8t57791Ve5TKCpPy10l+\n4+/vL1l92M9XX33FnDlz+Pvvv7M5KpUdDh48SO3ata0Ow6Hpv0HBZYzZISL+GW3nkGcO0dHRBAYG\nEhkZaXUoSimVJzlkctB7HZRS6vYcMjnovQ5KKXV7Dpkc9MxBKaVuzyGTg6enJ/7+/hQrVszqUJRS\nKk9yuJvgAFxdXXWkklJK3YZDnjkolVfs3r2bVatWpbsuICCArl27AjBv3jwaNGhA/fr1uf/++9mz\nZ09uhqkckMMmh9dee43OnTtbHYZyYAkJCbdNDqlVrlyZ33//nX379vHee+8xaNCgLB83MTExTRxK\n3cxhk0NMTAy7d++2OgyVR02aNIl69epRr149+1QXt5rKe8SIEdSpU4cGDRrYZ4L95ZdfaNasGY0a\nNaJjx46EhYUBMGbMGAYMGEDLli0ZMGAA77//PosWLcLX19deX3ruv/9+PDw8AGjevPktR9qtXbuW\nFi1a0LhxY3r16mW/l8fHx4fhw4fTuHFjfvjhB9q2bcvQoUPx9/dnypQp2fNDUwWKQ/Y5QPKIpbCw\nMOLi4ihSpIjV4ajbSJly+z//+Q81a9bks88+Y8WKFfZpuQ8fPsxLL70E/G+SvUGDBnHkyBHefPNN\nunXrxi+//MLnn39OjRo1+O677257vB07dvB///d/bNu2DRGhWbNmtGnThmPHjqWZyjsiIoJly5Zx\n6NAhjDFcvnwZgFatWrF161aMMUyfPp1PPvnEPr13UFAQW7ZswdXVlVmzZhEYGMjXX3+d6Z/HjBkz\n6NKlS5ryCxcu8MEHH/Dbb7/h5ubGxx9/zKRJk+yTBpYpU8Y+T9S3335LXFwcWZ1lQBV8DpscUu51\nOHPmDD4+PtYGo/KULVu20KNHD/uMp48//jibN2+mc+fOvPnmmwwfPpyuXbvSunVrEhIScHFx4fnn\nn6dr1672PoKQkBD69OnD2bNniYuLu2Fa7e7du+Pq6pql2DZu3MiMGTPYsmVLmnVbt24lKCiIli1b\nAhAXF0eLFi3s6/v06XPD9jd/Vio1h00Oqe910OSQt9085fZbb71lv3wDULNmzTTb3Hx20K1bN7p1\n63ZXcdxqKu/t27ezfv16lixZwtdff82GDRt45ZVXeOONN+jevTsBAQGMGTPGXk9Wp9neu3cvL7zw\nAqtXr6ZMmTJp1osIDz74IAsWLEh3f53uW90Jh+1zqFKlCh07dsTZ2dnqUFQe07p1a5YvX050dDRR\nUVEsW7aM1q1bpzuVd2RkJFeuXOHhhx/miy++sI8iunLliv3sdPbs2bc8Vman+j516hSPP/44c+fO\npUaNGulu07x5c/744w+Cg4OB5D6SI0eO3GnzlQIc+MyhevXqrFu3zuowVB7UuHFjnnnmGZo2bQrA\nCy+8QKNGjfj1118ZNmwYhQoVwtnZmWnTpnHt2jUeffRRYmNjEREmTZoEJHc89+rVCw8PD9q3b8/x\n48fTPVa7du3sT30bOXLkLS/1jBs3joiICF5++WUAChcunKa/oFy5csyaNYt+/fpx/fp1AD744INb\nJhOlbschp+xWeZtOF209/TcouHTK7kzo1KkTTz/9tNVhKKVUnuPQySEhIcF+fVYppdT/OHRy8PT0\n1Gm7lVIqHQ6dHLy8vDhz5gxJSUlWh6KUUnlKhsnBGONtjNlojAkyxhwwxrxmKy9tjFlnjDlqe/dI\ntc9IY0ywMeawMaZTqnI/Y8w+27ovjTHGVl7UGLPIVr7NGOOT/U1Ny8vLi4SEBM6fP58bh1NKqXwj\nM2cOCcCbIlIHaA4MNsbUAUYA60WkOrDe9hnbur5AXaAzMNUY42SraxrwIlDd9kqZ+e554JKIVAO+\nAD7OhrZlqH79+vTs2ZP4+PjcOJxSSuUbGSYHETkrIjtty9eAg4An8CiQcnfPbOAx2/KjwEIRuS4i\nx4FgoKkx5h6ghIhsleTxs3Nu2ielriVAh5SzipzUunVrfvjhB7y9vXP6UMqBLF++nKCgoHTXjRkz\nhs8++wyAYcOGUatWLRo0aECPHj3s8zIplRfcUZ+D7XJPI2AbUEFEztpWnQMq2JY9gdOpdguxlXna\nlm8uv2EfEUkArgBp5wfIIfn1Xg+V9yQkJNw2OaT24IMPsn//fvbu3UuNGjX46KOPsnRMEUnTb3bz\ntNxK3alMJwdjjDuwFBgqIldTr7OdCeT4N6wxZpAxJtAYExgeHn7X9YkInp6evPvuu9kQnSoobjU1\n97hx42jSpAn16tVj0KBB9j8qUk9//fHHH/Pzzz8zbNgwfH19+eeff255nIceeojChZMnKbjdNNyf\nfvopTZo0oUGDBowePRqAEydOULNmTQYOHEi9evU4ffo07u7uvPnmmzRs2JC//vorO38kygFlavoM\nY4wzyYlhnoj8aCsOM8bcIyJnbZeMUnp1Q4HU12m8bGWhtuWby1PvE2KMKQyUBCJujkNEvgO+g+Q7\npDMTewbtwtnZmdOnT2e8sbLE0KFDs/25G76+vvZnNKRnzZo1aabmBhgyZIh9+usBAwawYsUK+2R+\nqae/Pnr0KF27dqVnz56ZjmnmzJnpTp2xdu1ajh49yvbt2xERunfvzqZNm7jvvvs4evQos2fPpnnz\n5kByUmvWrJl9anCl7kZmRisZYAZwUEQmpVr1M5Bye/HTwE+pyvvaRiBVJrnjebvtEtRVY0xzW50D\nb9onpa6ewAbJpWs9Xl5ehIaGZryhchj169dn3bp1DB8+nM2bN1OyZEkgebrsZs2aUb9+fTZs2MCB\nAwfs+9zN9NcTJkygcOHCPPnkk2nWrV27lrVr19KoUSMaN27MoUOHOHr0KACVKlWyJwYAJycnnnji\niSzHoVRqmTlzaAkMAPYZY1L+hHsHmAgsNsY8D5wEegOIyAFjzGIgiOSRToNFJOUC6MvALMAVWG17\nQXLymWuMCQYukjzaKVd4enrqE+HysNv9hZ9T0pua++233+bll18mMDAQb29vxowZQ2xsrH2frE5/\nPWvWLFasWMH69etJbwyGiDBy5Ej7w4xSnDhxIs0xXVxccHJyQqnskGFyEJEtwK1GDnW4xT4TgAnp\nlAcC9dIpjwV6ZRRLTvDy8mLFihWISLq/nMrxnDlzhtKlS/PUU09RqlQppk+fbk8EZcuWJTIykiVL\nltzyslFmp+Fes2YNn3zyCb///jvFihVLd5tOnTrx3nvv8eSTT+Lu7k5oaKhOM69yhcNO2Z2iVatW\nXL16lfj4eH1cqAJg3759aabmLlWqFC+++CL16tWjYsWKNGnS5Jb79+3blxdffJEvv/ySJUuWULVq\n1XS3GzJkCNevX+fBBx8Ekjulv/322xu2eeihhzh48KD9iW7u7u7897//1TMEleN0ym6V5+h00dbT\nf4OCS6fsvgNJSUl6l7RSSqXi8MkhNDQUFxcX5syZY3UoSimVZzh8cihXrhwJCQk6dXcek18vdxYE\n+rNXoMmBIkWKUL58eU0OeYiLiwsRERH6JWUBESEiIgIXFxerQ1EWc/jRSqA3wuU1Xl5ehISEkB1T\npKg75+LigpeXV8YbqgJNkwPJN8IdP37c6jCUjbOzM5UrV7Y6DKUcmiYH4LHHHuPkyZNWh6GUUnmG\nJgfg2WeftToEpZTKUxy+QzpFVFQUcXFxVoehlFJ5giYHICAgAHd3d/744w+rQ1FKqTxBkwNw7733\nAuiIJaWUstHkQPJoJUDvdVBKKRtNDiTPxV+qVClNDkopZaPJwUZvhFNKqf/Roaw2gwYNwt3d3eow\nlFIqT9DkYPPKK69YHYJSSuUZelnJJjExkdDQUBITEzPeWCmlCjhNDjYzZ87UfgellLLR5GCjw1mV\nUup/NDnYpDwvd9++fRZHopRS1tPkYOPj44OHhwc7duywOhSllLKcJgcbYwx+fn4EBgZaHYpSSllO\nh7KmMmTIEK5evWp1GEopZTlNDqk8+uijVoeglFJ5gl5WSkVE2LdvH0eOHLE6FKWUspQmh5u0adOG\nzz//3OowlFLKUpocUjHG0LhxYx2xpJRyeJocbuLn58e+ffv0kaFKKYemyeEmfn5+xMXFsX//fqtD\nUUopy2hyuImfnx+AXlpSSjk0Hcp6kypVqrBo0SJat25tdShKKWUZTQ43McbQu3dvq8NQSilLZXhZ\nyRgz0xhz3hizP1XZGGNMqDFmt+31cKp1I40xwcaYw8aYTqnK/Ywx+2zrvjTGGFt5UWPMIlv5NmOM\nT/Y28c6dOHGCqVOnEh8fb3UoSillicz0OcwCOqdT/oWI+NpeqwCMMXWAvkBd2z5TjTFOtu2nAS8C\n1W2vlDqfBy6JSDXgC+DjLLYl22zdupXBgwdz4MABq0NRSilLZJgcRGQTcDGT9T0KLBSR6yJyHAgG\nmhpj7gFKiMhWERFgDvBYqn1m25aXAB1Sziqsop3SSilHdzejlV4xxuy1XXbysJV5AqdTbRNiK/O0\nLd9cfsM+IpIAXAHK3EVcd61q1aqUKFFCk4NSymFlNTlMA6oAvsBZIFfmmzDGDDLGBBpjAsPDw3Ps\nOIUKFdI7pZVSDi1LyUFEwkQkUUSSgO+BprZVoYB3qk29bGWhtuWby2/YxxhTGCgJRNziuN+JiL+I\n+JcrVy4roWean58fe/bs0U5ppZRDylJysPUhpOgBpIxk+hnoaxuBVJnkjuftInIWuGqMaW7rTxgI\n/JRqn6dtyz2BDbZ+CUu98cYbHDt2DGdnZ6tDUUqpXJfhfQ7GmAVAW6CsMSYEGA20Ncb4AgKcAF4C\nEJEDxpjFQBCQAAwWkURbVS+TPPLJFVhtewHMAOYaY4JJ7vjumx0Nu1v33nuv1SEopZRlTB74Iz1L\n/P39Jacf6Tl16lRcXV159tlnc/Q4SimVW4wxO0TEP6PtdG6l21i0aBH/+c9/rA5DKaVynSaH20jp\nlE5ISLA6FKWUylWaHG7Dz8+P2NhYgoKCrA5FKaVylSaH29A7pZVSjkqTw23UqFGD4sWLc/z4catD\nUUqpXKVTdt9GoUKFOHv2LG5ublaHopRSuUrPHDKgiUEp5Yg0OWRg3759dOvWjUOHDlkdilJK5RpN\nDhkoXLgwK1asYOvWrVaHopRSuUaTQwZq1KhB+fLlWb16dcYbK6VUAeFwyWHNmjXUq1ePM2fOZGp7\nJycnevbsyYoVK4iKisrh6JRSKm9wuORQtGhRDhw4cEePAO3duzfR0dGsWLEiByNTSqm8w+GSg6+v\nL9OmTaN27dqZ3qdVq1a0adMmB6NSSqm8RWdlVUopB6Kzst7G2rVr+eabb+54v+vXr2e6r0IppfIz\nh0wOy5cvZ9SoUdzpWVPTpk156aWXcigqpZTKOxwyObRs2ZJWrVoRHR19R/t17NiRX3/9lUuXLuVQ\nZEoplTc4ZHJ48skn+eWXX+54aow+ffoQHx/P8uXLcygypZTKGxwyOQBERETccf9BkyZNqFy5MosW\nLcqhqJRSKm9w2ORQs2ZNxowZc0f7GGPo3bs3v/32GxcuXMiZwJRSKg9w2Cm769atm6XJ9AYNGkS7\ndu0oWbJkDkSllFJ5g8Mmhx9++AEPD4873q9KlSpUqVIlByJSSqm8w2EvK5UvXx5nZ+cs7Xv69GlG\njBhBWFhYNkellFJ5g8Mmh8OHD9O8eXN+//33O9736tWrfPzxxyxdujQHIlNKKes5bHIoVaoU27Zt\nY9euXXe8b926dalTp46OWlJKFVgOmxzKly/P5MmTad++fZb279OnD5s3b9bpNJRSBZLDJgdjDK+9\n9hoNGjTI0v59+vRBRPjhhx+yOTKllLKewyYHgF27djFx4sQ7nmMJku+TaNKkCefPn8+ByJRSyloO\nO5QV4M8//2TkyJEMHDiQe++9947337RpEy4uLjkQmVJKWcuhzxwaNWpE27ZtuXr1apb2T0kM+/bt\nIz4+PjtDU0opSzl0crj//vvZuHEjtWrVynIdgYGBNGjQgDlz5mRjZEopZS2HTg4AMTExnD59Osv7\n+/n50aRJE8aPH09cXFw2RqaUUtZx+OTQpUsX+vbtm+X9jTGMGzeOkydPMmPGjGyMTCmlrOPwyaFO\nnTocPHgwSyOWUnTq1In777+fCRMmEBsbm43RKaWUNTJMDsaYmcaY88aY/anKShtj1hljjtrePVKt\nG2mMCTbGHDbGdEpV7meM2Wdb96UxxtjKixpjFtnKtxljfLK3ibc3duxYTp48iS2cLDHGMH78eM6f\nP89ff/2VjdEppZQ1MnPmMAvofFPZCGC9iFQH1ts+Y4ypA/QF6tr2mWqMcbLtMw14Eahue6XU+Txw\nSUSqAV8AH2e1MVlRrlw5ihcvftf1tG/fnpMnT9KuXbtsiEoppayVYXIQkU3AxZuKHwVm25ZnA4+l\nKl8oItdF5DgQDDQ1xtwDlBCRrZJ8/WbOTfuk1LUE6GDu5s/4OxQdHU3Hjh2ZOXPmXdd1zz33AOhs\nrUqpfC+rfQ4VROSsbfkcUMG27AmkHvoTYivztC3fXH7DPiKSAFwBymQxrjvm6urK7t27s+1y0Hvv\nvUe9evW4du1attSnlFJWuOsOaduZQNZ7c++AMWaQMSbQGBMYHh6eXXXyySef0K9fv2ypr1u3bly4\ncIGvvvoqW+pTSikrZDU5hNkuFWF7T5lgKBTwTrWdl60s1LZ8c/kN+xhjCgMlgYj0Dioi34mIv4j4\nlytXLouhp/Xcc89leXbWmzVt2pRu3boxceJETp06lS11KqVUbstqcvgZeNq2/DTwU6ryvrYRSJVJ\n7njebrsEddUY09zWnzDwpn1S6uoJbJC7GVeaBadOnWLy5MlcuHAhW+qbMmUKIsKzzz5LUlJSttSp\nlFK5KTNDWRcAfwE1jTEhxpjngYnAg8aYo0BH22dE5ACwGAgC1gCDRSTRVtXLwHSSO6n/AVbbymcA\nZYwxwcAb2EY+5aZjx47x+uuvZ+nBP+mpXLkyX3zxBYGBgRw+fDhb6lRKqdxkcvmP9Gzj7+8vgYGB\n2VLX+fPnefjhh5kwYQKdOnXKeIdMEBHCwsKoWLFittSnlFLZwRizQ0T8M9rO4e+QhuSnwgUGBmZb\nYoDkju6KFSsiIixatIiEhIRsq1sppXKaJgebxMREQkJCMt7wDgUEBNC3b18mTpyY7XUrpVRO0eRg\nM3ToUOrVq3dXcyylp127dvTt25exY8dmW5+GUkrlNE0ONrVq1eLKlSucOXMm2+v+5ptvKFeuHAMG\nDNCJ+ZRS+YImB5v+/ftz7ty5LD0uNCOlS5dmxowZHDhwgPfffz/b61dKqezm0M+QTs3DI3li2Zwa\nvdWlSxeGDx+Ov3+GgwSUUspyeuaQyrx586hUqRJRUVE5Uv/EiRPp2bMnkPwEOqWUyqs0OaTi5eXF\n6dOnWbFiRY4eZ86cOdSuXTtH+jeUUio7aHJIpVWrVsyePZuHHnooR4/TsGFDIiIi6N69e46dpSil\n1N3Q5JCKk5MTAwcOtPc/5JSGDRuycOFCdu3axYABA3T+JaVUnqPJ4SbXrl1j4MCBLFy4MEeP88gj\njzBp0iSWLVvGyJEjc/RYSil1p3S00k3c3d3ZvHkz58+fp2/fvjl6rFdffZXDhw8jIojIXT3HWiml\nspMmh5sYYxg/fjxFihTJlWN988039qQQGxuLi4tLjh9XKaUyopeV0vHUU0/Ru3fvXDlWSmI4dOgQ\nNWrUYOXKlblyXKWUuh1NDrfw22+/MXr06Fw7XoUKFahQoQI9evTgl19+ybXjKqVUejQ53MIff/zB\n+PHjc+1eBA8PD9atW4evry9PPPEEP/30U8Y7KaVUDtHkcAv9+vWjd+/eREdH59oxS5Uqxbp162jc\nuDE9e/bkt99+y7VjK6VUatohfQs1atTI8eGs6SlZsiRr165lxIgRNGnSJNePr5RSoGcOtxUVFcXc\nuXM5ffp0rh63RIkSTJ06lZIlSxIdHc2aNWty9fhKKaXJ4TbCw8MZOHAg8+fPtyyGDz74gC5dujBu\n3LgcmzFWKaVuppeVbsPHx4dOnToRFxdnWQyjR48mNDSU0aNHc/ToUaZPn07RokUti0cp5Rg0OWRg\n9erVlt65XLRoUWbNmkWNGjUYNWoUJ06cYNmyZZQtW9aymJRSBZ9eVsqAMYbLly/z66+/WhrDu+++\ny6JFizhy5AhhYWGWxaKUcgyaHDJh+PDhPPbYY5Y/f6F3794cO3aMunXrIiIEBQVZGo9SquDS5JAJ\nw4cPx8PDg4MHD1odCm5ubgDMnj2bevXqMXr0aBISEiyOSilV0GifQyZUqVKFkydP4uzsbHUodj17\n9iQgIIBx48YREBDA/Pnz8fT0tDospVQBoWcOmeTs7ExISAhz5861OhQgeWrxWbNmMWfOHHbs2EHD\nhg1ZvXq11WEppQoITQ53YPLkyTzzzDMcPnzY6lDsBgwYwI4dO/D29ubKlStWh6OUKiA0OdyBt99+\nm7p163Lu3DmrQ7lBzZo1+fvvv+0PJ5o/fz579+61OCqlVH6myeEOlC9fnj179tCmTRurQ0mjcOHk\n7qO4uDjeeecd/Pz8GDVqFLGxsRZHppTKjzQ53CFjDEFBQXzyySdWh5KuIkWKsGPHDvr378+ECRNo\n1KgRW7ZssTospVQ+o8khC5YtW8bw4cPZvn271aGkq0yZMsyePZs1a9YQExPDAw88kCeG4Sql8g9N\nDlnw6quv8tBDD5GUlGR1KLfVqVMn9u/fz9y5c6lduzYAgYGBeT5upZT1TH6d6dPf318CAwOtDiNf\nOXr0KLVr18bPz49JkybRsmVLq0NSSuUyY8wOEfHPaLu7OnMwxpwwxuwzxuw2xgTaykobY9YZY47a\n3j1SbT/SGBNsjDlsjOmUqtzPVk+wMeZLY+VMd3dg//799OrVi5iYGKtDyZSqVasyY8YMQkJCaNWq\nFX369OH48eNWh6WUyoOy47JSOxHxTZWJRgDrRaQ6sN72GWNMHaAvUBfoDEw1xjjZ9pkGvAhUt706\nZ0NcOS4kJIQlS5YwbNgwq0PJlEKFCvH0009z5MgRxowZw4oVK6hXrx4XLlywOjSlVB6TE30OjwKz\nbcuzgcdSlS8UkesichwIBpoaY+4BSojIVkm+xjUn1T55WufOnfn66695+eWXrQ7ljri5uTF69GiO\nHDnC1KlT7dN/z507l4iICIujU0rlBXebHAT4zRizwxgzyFZWQUTO2pbPARVsy55A6udthtjKPG3L\nN5fnC4MHD6ZOnTpERkZy6tQpq8O5I56enjz99NMAnDhxgmeeeQYfHx9GjBhBeHi4xdEppax0t8mh\nlYj4Al2AwcaYB1KvtJ0JZFuPtzFmkDEm0BgTmJe+vESEhx9+mO7du+eb/oeb+fj4sHfvXrp27con\nn3yCj48Pw4YN4+LFi1aHppSywF0lBxEJtb2fB5YBTYEw26UibO/nbZuHAt6pdveylYXalm8uT+94\n34mIv4j4lytX7m5Cz1bGGEaOHElwcDC7du2yOpwsq1u3LgsWLCAoKIjHH3+cr7/+2v6I1MjISIuj\nU0rlpiw/uotQAAAa80lEQVQnB2OMmzGmeMoy8BCwH/gZeNq22dPAT7bln4G+xpiixpjKJHc8b7dd\ngrpqjGluG6U0MNU++UaXLl04ceIE999/v9Wh3LVatWoxd+5cTp8+TcWKFQHo1q0b999/P4sXLyY+\nPt7iCJVSOe1uzhwqAFuMMXuA7cBKEVkDTAQeNMYcBTraPiMiB4DFQBCwBhgsIom2ul4GppPcSf0P\nkC/nni5btiyRkZG89NJLHD161Opw7lpKR7WI8Nhjj3H+/Hn69OlDlSpVmDBhAiEhIRnUoJTKr/Qm\nuGx2+vRpfH198fLyIjAwME89IOhuJSYmsmrVKqZMmcL69euZMGEC77zzDvHx8SQlJVG0aFGrQ1RK\nZSBXboJTaXl7e/PDDz8wZMiQApUYAJycnOjWrRu//fYbwcHBDBqUPEBt2bJl3Hvvvbz66qvs3LmT\n/PoHh1LqfzQ55ID27dvz4osvAvD5558THBxscUTZr2rVqvbLTlWqVOGhhx7iu+++w8/Pj5o1azJq\n1Ciio6MtjlIplVV6WSkHhYWFUbduXZydnQkMDCzwz3i+ePEiS5cuZfHixRw5coTjx49TqFAhVq1a\nxX333UfdunXJJzOjKFVgZfaykiaHHBYUFMTs2bP56KOPKFTIcU7UYmNjcXFxQUS47777CAkJoUqV\nKnTt2pVu3brxwAMPUKRIEavDVMrhaHLIg5YvX07p0qV54IEHMt64ADl37hzLly9nxYoVrF+/ntjY\nWAYOHMjs2bMREcLCwuxDZpVSOUuTQx6TmJiIv78/Bw8eZNWqVbRv397qkCwRHR3N+vXrKV++PM2a\nNePo0aPUqFGDOnXq0LFjRzp27EibNm0oUaKE1aEqVSDpaKU8xsnJiXXr1vHss8/SrFkzAIfssC1W\nrBjdunWz/wxKlCjBp59+ire3N99//z3du3endOnS/PRT8n2Q165d4/Lly1aGrJRD0uSQi8qWLcu0\nadNwc3Pj0KFDVKpUiW+//dahh35WqFCBt956izVr1nDp0iU2btzIyJEjady4MQALFiygdOnS+Pr6\nMmTIEBYuXMjp06cd+memVG7Qy0oWCQkJ4bnnniM0NJSdO3fqDWS3cODAAZYuXcqWLVv4888/iYqK\nAuDUqVN4e3uzfft2rly5QpMmTShVqpTF0SqV92X2slLh3AhGpeXl5cWvv/7K+fPnKVq0KFu3biUg\nIIDBgwdTvHhxq8PLM+rWrUvdunUBSEhIYPfu3ezcuRMvr+S5GidPnsyCBQsAqFGjBo0aNaJRo0a8\n/fbbOmxWqbugZw55xPvvv8/48eN54oknWLJkidXh5BuXL18mMDCQ7du3ExgYyK5duzDGcOzYMQBe\nfPFFzpw5Q/369alXrx716tWjVq1auLi4WBy5UtbQ0Ur50Pbt23FxcaFBgwasWbOGPXv2MHjwYNzd\n3a0OLV+JiYnB1dUVgGHDhvHrr79y6NAh+2yyvr6+9qnVv//+e9zc3KhVqxY1atTQn7Uq8DQ55HOv\nv/46kydP5oUXXuD7779HRPQyyV2Ij48nODiY/fv3Y4yhZ8+eAFSsWJGwsDD7dt7e3vTp04dPP/0U\ngICAAO699158fHz0pj1VIGifQz73xRdf0KdPH1IeavTNN9+wdOlSXn31VXr06GFxdPmPs7MztWvX\npnbt2jeUnzx5kn/++YdDhw7ZXylzRiUlJdG5c2euX79OoUKF8PHxoWrVqvTs2dM+6eDu3bupVKkS\nHh4eud4mpXKSJoc8rHnz5vZld3d3Tp06xZYtW+jRowfnz58nODiYZs2a4eTkZGGU+VvRokWpU6cO\nderUSbNORNiwYQPBwcEcPXqU4OBggoOD7WcaUVFRNGrUCICSJUtSqVIlKlWqRL9+/ejXrx9JSUkE\nBgbi7e1NhQoVHGr6FJX/aXLIJ5555hkGDhxof0b19OnTeffdd2nVqhWbN29GRIiJiaFYsWIWR1pw\nODk5cf/999/y6X5OTk78+OOPHDt2jOPHj3Pq1ClOnjzJ2bNngeRpQ1Ju9itcuDCenp54e3vz73//\nm/79+xMTE8PKlSvx9PTE09OTihUr6qUrlWdocshHChUqhJubGwCDBw+mSpUq9pvBgoKC8Pf3p2PH\njixevNjeIatyjouLy20v8ZUsWZKff/6Z06dP218hISEkJiY/APH48eP06tXrhn3Kly/Phx9+yPPP\nP094eDiTJ0/mnnvu4Z577qFixYpUrFgRT09PHW2lcpwmh3yqZMmS9O3b1/7Z1dWVQYMGcfToUVxd\nXRERmjVrRrVq1Rg9ejQ1a9a0MFrH5ObmRrdu3W65vmrVquzevZvQ0FDOnDlDaGgooaGhVK5cGUju\nD/n444/tySTFtGnT+Ne//sXBgwd57rnnqFChAuXLl7e/OnXqRM2aNYmNjeXSpUuULVu2wD14SuU8\nTQ4FRJUqVZgyZYr9c0xMDNWqVSMgIIAJEyYAMHLkSA4ePMjzzz9/2y8tlTuKFi1Kw4YNadiwYbrr\n/f39uX79OhEREZw9e5azZ88SFhZGixYtgOSbAt3d3fnnn3/YunUr4eHhJCUlMW/ePGrWrMm2bdto\n27YtAKVKlaJs2bKUK1eO8ePH06FDB06cOMHChQspU6YMZcuWpUyZMpQpUwYfHx/7GapyXJocCqhi\nxYoxf/78NHMQHTx4kJMnTwKwdOlSRo4cSZcuXeyJJSwsjPLly+uw2TzCycnJfkZwcxKpX78+69at\ns39OSkri4sWL9kuKVatWZerUqYSHh3PhwgUuXLhAeHi4vV9j//79jBw5Ms0xly5dyuOPP86GDRt4\n5plnKF26NB4eHnh4eFC6dGleeeUVGjZsSEhICFu2bMHDw4NSpUrZ30uXLk3hwvrVkt/pv2ABl/pL\n/qOPPuKjjz6yJwwPDw/q1q1rn/X06tWrVKxYkTJlyvDXX39RvXp1Nm3aRGJiIg0aNKBMmTKWtEFl\nTqFChezDcCF5ipZ///vft9y+a9euREVFERERwYULF4iIiCAiIsLeie7h4UGHDh24ePEiFy9e5MiR\nI1y6dIn+/fsDsHXrVvr165em3lWrVtGlSxd+/fVXhg4dSsmSJSlVqhQlS5akZMmSvP7669SuXZvj\nx4+zefNmSpQoQcmSJSlRogQlSpTA29tb+1TyAL0JTtldvXqV2bNns2/fPr788ktcXFxo06YNmzZt\nYsKECbzzzjts2bKF//znP/j5+TF06FAAwsPDKVu2rJ5tOJioqChOnjzJ5cuXuXz5MpcuXeLy5ct0\n794db29v/vzzTyZPnszly5e5cuWKfbsff/yRli1bMm/ePJ566qk09W7YsIF27drxww8/8NJLL1Gi\nRAmKFy9uf//000+pX78+u3bt4scff8Td3Z3ixYvb3x944AHKlCnD1atXuXjxIu7u7ri7u1O0aFH9\nP4reBHdLu3fv5uuvv2batGnaSXeTEiVK8Morr9xQNm/ePA4ePGjvJD179iy///47x44dY+jQocTH\nx1OxYkVcXFz4888/adiwIYsXL+bEiRO0bt2aFi1akJCQAKCXGgoYNze3dO8PSXG7YcAAPXr0IDg4\nmCtXrnD16lWuXLnCtWvX7BMt+vj48OSTT9rLr127xsWLF+1nvvv27ePDDz8kKSnphnr//PNPWrRo\nwbJly3jmmWfs5U5OTri7u7N27VqaNm3KypUrmThxIu7u7ri5udlfw4YNo3LlygQFBREQEICbmxvF\nihWjWLFiuLm50bhxY0qUKEFkZCRRUVH2dQXtfiOH+23dunUrM2bM4MqVK8yfP18TRAa8vLzsM6AC\n9OrVi169etlH0CQkJDBlyhSOHTuGt7c3AD/++COLFi1i5MiRtGjRgoCAADp37ky1atU4dOgQAGPH\njqVw4cL06dOHatWqceHCBeLj4ylXrpwmEQdRrFgxqlatesv1TZo0oUmTJrdcP3DgQAYMGEBMTAzX\nrl0jMjKSa9euUb16dQBatmzJ//3f/xEZGWlfFxUVZX8krTEGZ2dnIiIiOHXqFFFRUURFRdnvft+0\naRODBw9Oc9y///4bf39/5s+fz0svvWQvL1KkCMWKFWPjxo34+vry448/8sknn+Dq6kqxYsVwdXXF\n1dWVcePGUblyZQIDA1m1apW9POXVuXNnSpcuzblz5zh58iQuLi64urri4uKCi4tLrvXpONxv4b/+\n9S9iYmJ44403cHJy4r///a9+GWVByl9Jrq6uDBky5IZ1Cxcu5Pvvv7cnEG9vb0aMGHHDkMyZM2dy\n6tQp+3DbSZMm8dFHH/Hoo4+yfPlywsLC6N+/P+XKleO7776jRIkSrF69mqioKPz8/KhcuTLXr18H\n0GdhODBjjP0v9woVKtywrlq1alSrVu2W+z788MM8/PDDt1z/7LPP0qNHD6Kjo4mKirK/pwwLb9Wq\nFVOnTiU6OvqGbVKmvClatCilSpUiJiaGsLAwYmJiiImJITY2FkieaHP06NFpjrt7925Kly7N0qVL\n0/xuAezatQtfX9+Mfzh3yWH7HD777DOGDRtG//79mTNnToE7JcwPYmJicHJyokiRIuzYsYPt27fj\n5eVFt27dOHbsGAMGDOD8+fMcOHCAIkWK0KJFC7Zu3crkyZN57bXXmDt3LgMHDqRRo0bs3LkTSP6F\nd3V15cMPP6RmzZps2LCBw4cP06BBA1q2bElMTAz//PMPpUqVwtPTU69BK0slJibaE0ZK8qhUqRJF\nixbl1KlTHDhw4IZ1sbGx9O3b964Gh2S2zwERyZcvPz8/uVsfffSRADJgwABJSEi46/pUzjp37pzs\n3r1bzp49KyIie/bskQ8++ECmTJkiIiIJCQnSsmVLqVOnjuzfv19ERJ577jkBZNCgQSIi8vfffwsg\ngP3fvG3btuLl5SULFiwQEZE1a9ZIz549ZfTo0SIikpSUJB999JF89dVXcv78eRER2b9/v2zatElO\nnDghIiJxcXFy6dIliYuLy50fhlJZBARKJr5jLf+Sz+orO5KDiMj48eMFkGeeeUYSExOzpU6Vd8TG\nxsrZs2ftX+oXLlyQxYsXy8yZM+3bTJgwQZ599lnZtGmTiIjMnz9f6tSpI0888YSIiERHR9sTSkrS\nGTBggAAyZMgQERH5448/BBBnZ2d7vR06dJBq1arJsmXLRERk2bJl8sgjj8g777wjIiLx8fHy+uuv\nyzvvvCPnzp0TEZH169fLjBkz5O+//xYRkUuXLsmGDRtk69at9npDQkLkzJkzEhMTIyLJyUupzNLk\ncAfGjBkjgDz33HMSEhKiv2zqBklJSRITEyPnz5+3nxkcOnRI1q1bJwcOHBCR5C/sSZMmySeffGLf\nb+TIkdK3b1/ZvHmziIjMmzdPGjduLE8//bSIiFy9elXc3d2lcOHCcvjwYRER6du3rwDyxhtviIjI\nxo0bBRA3Nzd7vTVq1BBA/vvf/4qIyGeffSZOTk7y4IMPiohIZGSk+Pj4SM2aNeWff/4REZGxY8dK\n+/bt5dtvvxURkQMHDsiTTz4p//rXv+z1fvzxx/LOO+/Inj17REQkMDBQJk+ebE9ucXFxMn/+fFmy\nZIlcvXpVRJLPoAICAuTYsWMiInLt2jXZv3+/HD161F5veHi4XLhwQa5fvy4iIomJifo7ZiFNDncg\nKSlJRo0aZf/rsGLFitKtWzcZO3asrFy5UsLCwvQ/s8pRKf+/Ll68KCdOnJDw8HARST5z2Lhxo6xb\nt86+7Q8//CDffvutHDlyRERENm/eLCNHjrR/8UdGRsqAAQOkd+/e9ktwY8aMkVatWslXX30lIsln\nOlWqVJE6derY661Tp444OTnJwoULRURk4sSJAkj79u3tsaT8jqR8+ffq1UsAGTZsmIiI/PbbbwJI\niRIl7PVWqVJFAHu9H3/8sQDSoUMHERG5fPmylCpVSsqWLWtPMkOGDJFq1arZk+22bdvE39/fvo+I\nyMCBA6VTp07y+++/i4jI8uXLpXfv3vLBBx+IiEhUVJQ8//zz8tJLL0lYWJiIiMyePVveeustWbly\npYiI/PPPPzJ27Fj57LPP7PXOmDFDJk+ebP/57t69W6ZPny6rV68WEZHr16/LggULZPHixXLt2jUR\nEdmxY4esXLlSDh06ZP933Lhxo/z555/2evfs2SOBgYFy8eJFEUlOmkFBQXLq1CkRSb4seuLECTl1\n6pTEx8fbfzbh4eESFRUlIslnmylnjFmlySELAgMD5csvv5SBAwdK7dq1xRhj/2VwcXGR++67T/z8\n/KRz584yYMAAeeONN2TcuHHy2WefybRp02TOnDmyZMkSWb16tQQEBMhff/0lO3bskH379snhw4fl\n+PHjEhoaKmFhYXLhwgW5fPmyREZGSkxMjMTHx+tlLZWnxMbGSkREhP3LLCEhQQ4ePCh79+6V2NhY\nEUk+A1m/fr39i/TcuXOyaNEiWbx4sb2euXPnypQpU+xnR1u2bJHRo0fbL+1FRkbKq6++Kv/+97/t\nSfHLL7+U/v37y/z580VEZOfOnfLwww/bL/WJiDzxxBPSrFkze+L87rvvpFatWvYzs0uXLsm9994r\nFSpUsPcNPfXUU+Lq6irvvvuuiIisXbtWAPHw8LDX6+PjI4C9DR9++OENySwiIsL+vZByZvbEE08I\nIMOHD7+h3lKlSt2y3pQ+z44dO96y3p49e6apt0+fPnfyz5hGZpODw45Wyoxr166xc+dOdu7cSWho\nKOHh4Wle0dHR2X7cQoUK2V9OTk4YYyhUqFC67xm9gDTLt3vP7HJ6n7O7PCvy4uijvBjTncqv3xOZ\nJfK/x/AmJSUhIvbfsaSkJBITEzHG2Ie9pwyjLlKkCMYY4uLiSExMpHDhwjg7O5OYmGjfJuUZK1FR\nUSQlJeHq6krhwoW5fv06169fx8nJCTc3N0SEK1euAMk3pBYqVIjIyEji4+Pt9zrEx8dz/fp1Pv30\nU/r06ZOltuod0tmgePHitGnThjZt2txym4SEBPsY55RXyrjn+Ph44uLibnhdv36dxMREEhIS7O8p\nr6SkJPsrMTHR/p6SyVP+06Zsk1HmB9Is3+49s8vpfc7u8qzIi19geTGmrCoISa6gyI3H0mpyuEuF\nCxe2TximlFIFRZ55qK0xprMx5rAxJtgYM8LqeJRSypHlieRgjHECvgG6AHWAfsaYW8/opZRSKkfl\nieQANAWCReSYiMQBC4FHLY5JKaUcVl5JDp7A6VSfQ2xlSimlLJBXkkOmGGMGGWMCjTGB4eHhVoej\nlFIFVl5JDqGAd6rPXrayG4jIdyLiLyL+KdPiKqWUyn55JTn8DVQ3xlQ2xhQB+gI/WxyTUko5rDxx\nn4OIJBhjhgC/Ak7ATBE5YHFYSinlsPLt9BnGmHDgZBZ3LwtcyMZw8gtHbTc4btu13Y4lM+2uJCIZ\nXpfPt8nhbhhjAjMzt0hB46jtBsdtu7bbsWRnu/NKn4NSSqk8RJODUkqpNBw1OXxndQAWcdR2g+O2\nXdvtWLKt3Q7Z56CUUur2HPXMQSml1G04XHJwlKnBjTEzjTHnjTH7U5WVNsasM8Yctb3n/BNDcpkx\nxtsYs9EYE2SMOWCMec1WXqDbboxxMcZsN8bssbV7rK28QLc7hTHGyRizyxizwva5wLfbGHPCGLPP\nGLPbGBNoK8u2djtUcnCwqcFnAZ1vKhsBrBeR6sB62+eCJgF4U0TqAM2BwbZ/44Le9utAexFpCPgC\nnY0xzSn47U7xGnAw1WdHaXc7EfFNNXw129rtUMkBB5oaXEQ2ARdvKn4UmG1bng08lqtB5QIROSsi\nO23L10j+wvCkgLfd9uz4SNtHZ9tLKODtBjDGeAGPANNTFRf4dt9CtrXb0ZKDo08NXkFEztqWzwEV\nrAwmpxljfIBGwDYcoO22Syu7gfPAOhFxiHYDk4G3gaRUZY7QbgF+M8bsMMYMspVlW7vzxNxKKveJ\niBhjCuxQNWOMO7AUGCoiV40x9nUFte0ikgj4GmNKAcuMMfVuWl/g2m2M6QqcF5Edxpi26W1TENtt\n00pEQo0x5YF1xphDqVfebbsd7cwhU1ODF2Bhxph7AGzv5y2OJ0cYY5xJTgzzRORHW7FDtB1ARC4D\nG0nucyro7W4JdDfGnCD5MnF7Y8x/KfjtRkRCbe/ngWUkXzbPtnY7WnJw9KnBfwaeti0/DfxkYSw5\nwiSfIswADorIpFSrCnTbjTHlbGcMGGNcgQeBQxTwdovISBHxEhEfkn+fN4jIUxTwdhtj3IwxxVOW\ngYeA/WRjux3uJjhjzMMkX6NMmRp8gsUh5QhjzAKgLcmzNIYBo4HlwGLgPpJntO0tIjd3WudrxphW\nwGZgH/+7Bv0Oyf0OBbbtxpgGJHdAOpH8R99iERlnjClDAW53arbLSm+JSNeC3m5jTBWSzxYguXtg\nvohMyM52O1xyUEoplTFHu6yklFIqEzQ5KKWUSkOTg1JKqTQ0OSillEpDk4NSSqk0NDkoh2WM+dP2\n7mOM6Z/Ndb+T3rGUyi90KKtyeKnHx9/BPoVFJOE26yNFxD074lPKCnrmoByWMSZlFtOJQGvbvPiv\n2yaw+9QY87cxZq8x5iXb9m2NMZuNMT8DQbay5baJzw6kTH5mjJkIuNrqm5f6WCbZp8aY/ba5+Puk\nqjvAGLPEGHPIGDPPdrc3xpiJJvn5FHuNMZ/l5s9IOS6deE+p5Dnv7WcOti/5KyLSxBhTFPjDGLPW\ntm1joJ6IHLd9fk5ELtqmrPjbGLNUREYYY4aIiG86x3qc5OctNCT57vW/jTGbbOsaAXWBM8AfQEtj\nzEGgB1DLNpFaqWxvvVLp0DMHpdJ6CBhom/56G1AGqG5btz1VYgB41RizB9hK8qSO1bm9VsACEUkU\nkTDgd6BJqrpDRCQJ2A34AFeAWGCGMeZxIPquW6dUJmhyUCotA7xie8KWr4hUFpGUM4co+0bJfRUd\ngRa2J7DtAlzu4rjXUy0nAin9Gk2BJUBXYM1d1K9UpmlyUAquAcVTff4V+Ldt6m+MMTVsM1/erCRw\nSUSijTG1SH4saYr4lP1vshnoY+vXKAc8AGy/VWC251KUFJFVwOskX45SKsdpn4NSsBdItF0emgVM\nIfmSzk5bp3A46T9ucQ3wL1u/wGGSLy2l+A7Ya4zZKSJPpipfBrQA9pD8JK+3ReScLbmkpzjwkzHG\nheQzmjey1kSl7owOZVVKKZWGXlZSSimVhiYHpZRSaWhyUEoplYYmB6WUUmloclBKKZWGJgellFJp\naHJQSimVhiYHpZRSafw/eWoEgzCUxNwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1c68c21450>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "xx=np.arange(iterations)\n",
    "fig, ax = plt.subplots()\n",
    "ax.plot(xx, sirt_l2err, 'k--', label='sirt l2 err')\n",
    "ax.plot(xx, ossarterr, 'k:', label='ossart l2 err')\n",
    "ax.plot(xx, sarterr, 'k', label='sart l2 err')\n",
    "plt.xlabel('iterations')\n",
    "legend = ax.legend(loc='upper center')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15+"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
